<?php

require_once( "classes/property.php" );

/**
 * Базовый класс для объекта в БД
 * 
 * Автор: Носков Алексей, alexey.noskov@gmail.com
 */
class DbObject {
	
	/**
	 * Ссылка на БД
	 */
	var $dbLink;
	
	/**
	 * Идентификатор объекта
	 */
	var $id;
	
	/**
	 * Имя таблицы для хранения объекта
	 */
	var $table;
	
	/**
	 * Карта свойств объекта
	 */
	var $properties = array();
	
	/**
	 * Добавить свойство в объект
	 *
	 * @param unknown_type $name имя свойства
	 * @param unknown_type $type тип свойства
	 */
	function addProperty( $name, $type ) {
		$this->properties[$name] = new Property( $name, $type, false, '', '', '' );
	}
	
	function addEditableProperty( $name, $type, $desc, $class, $style ) {
		$this->properties[$name] = new Property( $name, $type, true, $desc, $class, $style );
	}
	
	/**
	 * Получеить свойство объекта
	 *
	 * @param unknown_type $fieldName имя свойства
	 */
	function get( $fieldName ) {
		if ( $fieldName == "id" ) {
			return $this->id;
		} else if ( isset( $this->properties[$fieldName] ) ) {
			return $this->properties[$fieldName]->get();
		}
	}

	/**
	 * Установить свойство объекта
	 *
	 * @param unknown_type $fieldName имя свойства
	 * @param unknown_type $value значение свойства
	 */
	function set( $fieldName, $value ) {
		if ( isset( $this->properties[$fieldName] ) ) {
			return $this->properties[$fieldName]->set( $value );
		}
	}
	
	/**
	 * Сохранить объект в БД
	 */
	function save() {
		$sql = "UPDATE ".$this->table." SET";
		
		$first = true;
		foreach( $this->properties as $propname => $propvalue ) {
			if ( !$first ) $sql .= ", ";			
			$first = false;
			
			$sql .= $propname." = '".addslashes( $propvalue->get() )."'";
		}
		
		$sql .= " WHERE id = '".(int)$this->id."'";
		
		$this->dbLink->query( $sql );
	}
	
	/**
	 * Загрузить объект из БД
	 */
	function reload() {
		return $this->fetch( $this->dbLink->query( "SELECT * FROM ".$this->table." WHERE id = '".(int)$this->id."'" ) );
	}
	
	/**
	 * Удалить объект из БД
	 */
	function remove() {
		$this->dbLink->query( "DELETE FROM ".$this->table." WHERE id = '".(int)$this->id."'" );
	}
	
	/**
	 * Загрузить объект из запроса
	 *
	 * @param $query запрос
	 * @return true, если объект успешно загружен
	 */
	function fetch( $query ) {
		$data = $this->dbLink->fetch( $query );
		
		if ( $data ) {
			$this->loadFromData( $data );
			
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * Загрузить объект из карты свойств
	 *
	 * @param $data карта свойств
	 */
	function loadFromData( $data ) {
		foreach( $this->properties as $propname => $propvalue ) {
			$this->set( $propname, $data[ $propname ] );
		}
	}
}

?>